// 这个文件被用于管理各个轨道、列车等内容，是一个整体管理用的文件。
// 由于数据可能比较复杂，比如涉及到STL等，因此这一块先用着CPP语言。
#pragma once
#include "common.h"
#include "route.hpp"
#include "track.hpp"
#include "train.hpp"
#include <list>

class World {
private:
    // 装轨道的容器，用来安装各个轨道。轨道ID与轨道容器的索引一一对应。
    std::vector<Track *> tracks;
    // 轨道上的列车列表，是一个链表，索引为轨道ID，值为列车列表。
    std::list<Train *> trainsOnTrack;
    // 存储所有火车的指针
    std::vector<Train *> allTrains;
    // 轨道是否被占用的标记，索引为轨道ID，值为是否被占用。
    // 注意：轨道上没有列车时也可能被占用，比如特快列车和普快列车同时准备通过同一道岔出站，此时特快列车等级高，
    // 因此会将道岔相关的轨道区段全部锁定，仅供特快列车同行，直到自己通过之后才释放。
    std::vector<bool> tracksOccupied;

public:
    // 创建轨道，并且添加到世界
    Track *createTrack(fp_type length, fp_type speedLimit);
    // 创建火车，并且添加到世界
    Train *createTrain();
    // 创建列车路径，并且添加到世界
    void assignRoute(Train *train, std::vector<Track *> tracks,
                     std::vector<DIRECTION> directions);
};
